#include <iostream>
using namespace std;

/*
	模板函数声明成类的友元函数
*/
struct student
{
	char name[20];
	int age;
};

class Cat
{
public:
	Cat(string _name,int _age)
	{
		name=_name;
		age=_age;
	}
	template<class T1,class T2>
	friend int compare(T1 a,T2 b);
private:
	string name;
	int age;
};


template<class T1,class T2>
int compare(T1 a,T2 b)
{
	cout<<"调用非结构体版本的"<<endl;
	if(a>b)
		return 1;
	else if(a<b)
		return -1;
	else
		return 0;
} 

//单独定义一个针对学生结构体的模板函数--》模板函数的显式具体化
template<>
int compare(struct student stu1,struct student stu2)
{
	cout<<"调用专门针对结构体的显式具体化版本"<<endl;
	if(stu1.age>stu2.age)
		return 1;
	else if(stu1.age<stu2.age)
		return -1;
	else
		return 0;
}

//单独定义一个针对猫类的模板函数--》模板函数的显式具体化
template<>
int compare(Cat c1,Cat c2)
{
	cout<<"调用专门针对猫类显式具体化版本"<<endl;
	if(c1.age>c2.age)
		return 1;
	else if(c1.age<c2.age)
		return -1;
	else
		return 0;
}

//单独定义一个针对整数和猫类的模板函数--》模板函数的显式具体化
template<>
int compare(int n,Cat c1)
{
	cout<<"调用专门针对整数和猫类显式具体化版本"<<endl;
	if(n>c1.age)
		return 1;
	else if(n<c1.age)
		return -1;
	else
		return 0;
}

int main()
{
	int ret;
	int n1=78;
	int n2=89;
	struct student stu1={"张三",18};
	struct student stu2={"李四",20};
	Cat c1("旺财",4);
	Cat c2("来福",5);
	
	ret=compare(n1,n2);
	ret=compare(stu1,stu2);
	compare(c1,c2);
	compare(n1,c1);
}